package com.beta.platform.rest.constant.dic;


import org.springframework.util.StringUtils;

@SuppressWarnings({"PMD", "all"})
public interface DictEnum {

    /**
     * 字典码
     *
     * @return
     */
    default String getCode() {
        return this.toString();
    }

    /**
     * 返回数字值
     *
     * @return
     */
    int getIntValue();


    /**
     * 转值为Byte
     *
     * @return
     */
    default Byte toByte() {
        if (isStringValue()) {
            return null;
        }
        try {
            return Integer.valueOf(getIntValue()).byteValue();
        } catch (Exception exception) {
            return null;
        }
    }

    /**
     * 转值为Short
     *
     * @return
     */
    default Short toShort() {
        if (isStringValue()) {
            return null;
        }
        try {
            return Integer.valueOf(getIntValue()).shortValue();
        } catch (Exception exception) {
            return null;
        }
    }

    /**
     * 转值为Integer
     *
     * @return
     */
    default Integer toInteger() {
        if (isStringValue()) {
            return null;
        }
        try {
            return Integer.valueOf(getIntValue());
        } catch (Exception exception) {
            return null;
        }
    }


    /**
     * 返回值，可以是int或是String
     *
     * @return
     */
    default Object getValue() {
        if (isStringValue()) {
            return getCode();
        }
        return getIntValue();
    }


    /**
     * 是否是String类型的，默认是int，如果数据库要存Sring类型请重新实现此方法返回true
     *
     * @return
     */
    default boolean isStringValue() {
        return false;
    }


    /**
     * 枚举转换
     *
     * @param enumClass
     * @param enumCode
     * @param <E>
     * @return
     */
    public static <E extends Enum<?> & DictEnum> E convert(Class<E> enumClass, String enumCode) {
        return convert(enumClass, enumCode, null);
    }

    /**
     * 枚举转换
     *
     * @param enumClass
     * @param enumCode
     * @param <E>
     * @return
     */
    public static <E extends Enum<?> & DictEnum> E convert(Class<E> enumClass, String enumCode, E defaultValue) {
        if (StringUtils.isEmpty(enumCode) || enumClass == null) {
            return null;
        }
        E[] enumConstants = enumClass.getEnumConstants();
        for (E e : enumConstants) {
            if (e.getCode().equalsIgnoreCase(enumCode)) {
                return e;
            }
        }
        if (defaultValue == null) {
            throw new IllegalArgumentException("the code didn't match any enum,code:" + enumCode + ",enum class:" + enumClass.getName());
        }
        return defaultValue;

    }

    public static <E extends Enum<?> & DictEnum> E convert(Class<E> enumClass, Number intValue) {
        return convert(enumClass, intValue, null);
    }

    /**
     * 枚举转换
     *
     * @param enumClass
     * @param intValue
     * @param <E>
     * @return
     */
    public static <E extends Enum<?> & DictEnum> E convert(Class<E> enumClass, Number intValue, E defaultValue) {
        if (intValue == null || enumClass == null) {
            return null;
        }
        E[] enumConstants = enumClass.getEnumConstants();
        for (E e : enumConstants) {
            if (e.getIntValue() == intValue.intValue()) {
                return e;
            }
        }
        if (defaultValue == null) {
            throw new IllegalArgumentException("the code didn't match any enum,intValue :" + intValue + ",enum class:" + enumClass.getName());
        }
        return defaultValue;
    }


    /**
     * 转成Byte
     *
     * @param dictEnum
     * @return
     */
    public static Byte toByte(DictEnum dictEnum) {
        if (dictEnum != null) {
            return dictEnum.toByte();
        }
        return null;
    }

    /**
     * 转成Short
     *
     * @param dictEnum
     * @return
     */
    public static Short toShort(DictEnum dictEnum) {
        if (dictEnum != null) {
            return dictEnum.toShort();
        }
        return null;
    }

    /**
     * 转成Integer
     *
     * @param dictEnum
     * @return
     */
    public static Integer toInteger(DictEnum dictEnum) {
        if (dictEnum != null) {
            return dictEnum.toInteger();
        }
        return null;
    }


}
